// ************************************************************************* public class CycleWorkSpace extends WorkSpace { public boolean AnyCycles; public int counter; public static final int WHITE = 0; public static final int GRAY = 1; public static final int BLACK = 2; public CycleWorkSpace() { AnyCycles = false; counter = 0; } public void init_vertex(Vertex v) { v.VertexCycle = Integer.MAX_VALUE; v.VertexColor = WHITE; // initialize to white color } public void preVisitAction(Vertex v) { // This assigns the values on the way in if (v.visited != true) { // if it has not been visited then set the // VertexCycle accordingly v.VertexCycle = counter++; v.VertexColor = GRAY; // we make the vertex gray } } public void postVisitAction(Vertex v) { v.VertexColor = BLACK; // we are done visiting so make it black counter--; } // of postVisitAction public void checkNeighborAction(Vertex vsource, Vertex vtarget) { // if the graph is directed is enough to check that the source node // is gray and the adyacent is gray also to find a cycle // if the graph is undirected we need to check that the adyacent is not // the father, if it is the father the difference in the VertexCount is // only one. // directed if ((vsource.VertexColor == GRAY) && (vtarget.VertexColor == GRAY)) { AnyCycles = true; } // undirected case if ((vsource.VertexColor == GRAY) && (vtarget.VertexColor == GRAY) && vsource.VertexCycle != vtarget.VertexCycle + 1) { AnyCycles = true; } } // of checkNeighboor }